package com.amigo.online.provider.user.service;

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.amigo.online.common.core.response.Response;
import com.amigo.online.common.core.service.IService;
import com.amigo.online.common.param.dto.login.LoginByIdDto;
import com.amigo.online.common.param.dto.adv.AdvNearbyDto;
import com.amigo.online.common.param.dto.user.GetReginIdDto;
import com.amigo.online.common.param.dto.user.PasswordDto;
import com.amigo.online.common.param.dto.user.SexDto;
import com.amigo.online.common.param.dto.user.TipOffDto;
import com.amigo.online.common.param.dto.user.UserInfoDto;
import com.amigo.online.common.param.dto.user.UserNotifyDto;
import com.amigo.online.common.param.result.*;
import com.amigo.online.common.param.result.VideoInfo.VideoUserInfo;
import com.amigo.online.provider.user.model.entity.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.http.ResponseEntity;

public interface UserService extends IService<User> {

    /**
     * 检测帐号是否存在
     *
     * @param account
     * @param type
     * @return
     */
    public boolean accountExist(String account, Integer type);

    /**
     * 注册
     *
     * @param mobilephone
     * @param code
     * @param password
     * @param password2
     * @return
     */
    public LoginInfo register(String mobilephone, String countryCode, String code, String password, String password2, String registerCode,Double[] point);

    /**
     * @param type
     * @param username
     * @param password
     * @param point
     * @param platform
     * @return
     */
    public LoginInfo login(Integer type, String username, String password, Double[] point, String platform, String version, String device);

    /**
     * 完善用户头像，昵称，性别
     *
     * @param id
     * @param nickname
     * @param sex
     * @param avatar
     * @return
     */

    public boolean complete(Long age, String nickname, String sex, String avatar, Double[] point, String platform, String version, String device, String inviteCode);

    /**
     * 修改用户信息
     *
     * @param dto
     * @return
     */
    public boolean updateUserInfo(UserInfoDto dto);

    /**
     * 获取用户信息 自己的
     *
     * @return
     */
    public UserInfo getUserInfo();

    /**
     * 修改用户帐号
     *
     * @param account
     * @return
     */
    boolean updateUserAccount(String account);

    /**
     * 根据ID获取用户信息
     *
     * @param id
     * @return
     */
    public UserIndexInfo getUserInfoById(Long id);


    /**
     * 根据Token获取当前用户
     */
    UserInfo getUserInfoByToken(String token);

    /**
     * 修改密码
     *
     * @param dto
     * @return
     */
    boolean updateUserPassword(PasswordDto dto);


    /**
     * 退出登录
     */
    void logout();


    public List<UserPointInfo> getUserInfoFromMongo(List<Long> id);

    /**
     * 查询所有数据
     */
    public List<UserInfo> getAll();

    List<ModelPersonInfo> findModle(@Param("pageStart") int page, @Param("limit") int limit);

    /**
     * 获取好友数 关注数 粉丝数  群数
     */
    public Map<String, Object> getUserInfoNum(Long id);

    /**
     * 举报内容
     *
     * @param dto
     * @return
     */
    public Long newTipOff(TipOffDto dto);

    public Integer getRegionId(GetReginIdDto getReginIdDto);

    public boolean checktoken(String token);

    /**
     * 功能: 查询随机推荐的附近三个人头像
     * <p>作者 zhaox 2018年7月10日 上午10:49:42
     *
     * @param point
     * @param sexType
     * @return
     */
    List<Object> findPartAroundPeopleImg(Double[] point, Integer sexType, int number);

    List<Long> findPartAroundPeopleImgV2(Double[] point, Integer sexType, int number);

    /**
     * 功能: 查找附近的人
     * <p>作者 zhaox 2018年7月10日 上午11:37:20
     *
     * @param point
     * @param page
     * @param distance
     * @param sexType
     * @param showtimeType
     * @param leastAge
     * @param largetAge
     * @param advNearbyDto //广告参数
     * @return
     */
    List<AroundPersonInfo> findAroundPeople(Double[] point, Integer page, Integer distance, Integer sexType,
                                            Integer showtimeType, Integer leastAge, Integer largetAge, Integer pageCount, AdvNearbyDto advNearbyDto);

    /**
     * 绑定用户脸书id
     *
     * @param facebookId
     * @return
     */
    boolean bindface(String facebookId);


    /**
     * 设置用户隐私
     *
     * @param dto
     * @return
     */
    public boolean setSecretLevel(UserInfoDto dto);

    /**
     * 绑定用户信息
     *
     * @param type 类型
     * @param flag
     * @return
     */
    public boolean bind(Integer type, String flag, String code);

    /**
     * 更改用户通知等级
     *
     * @param dto
     * @return
     */
    public boolean setNotifyLevel(UserNotifyDto dto);

    /**
     * 解除用户绑定信息
     *
     * @param type
     * @return
     */
    public boolean unBind(Integer type);

    /**
     * 根据语言获得用户的地区信息
     *
     * @param lang
     * @return
     */
    public UserAreaInfo getAreaInfo(String lang, Long id);

    public List<Long> getfollowedByUserId(Long userId, List<Long> ids);

    /**
     * 获取当前用户的国家区号
     *
     * @return
     */
    public String getUserCountryCode();

    /**
     * 修改用户性别
     *
     * @param dto
     * @return
     */
    boolean updateUserSex(SexDto dto);

    /**
     * 功能: 修改用户请求
     * <p>作者 zhaox 2018年8月28日 上午11:38:48
     *
     * @param point
     * @return
     */
    boolean updateUserPoint(List<Double> point, long userId);

    /**
     * 获得用户黑名单
     *
     * @return
     */
    List<BlackUserInfo> getBlackList(Integer page, Integer size);

    /**
     * 拉黑某人
     *
     * @param userId
     * @return
     */
    Boolean blackUser(Long userId);

    /**
     * 取消拉黑某人
     *
     * @param userId
     * @return
     */
    Boolean cancelBlackUser(Long userId);

    UserInfo getWatermarkVideoUserInfo(Long id);

    /**
     * 更新用户lastLoginTime
     *
     * @return
     */
    public boolean updateLastLoginTime();

    /**
     * 获取视频的作者信息
     *
     * @param id
     * @return
     */
    VideoUserInfo getVideoUserInfoById(Long id);

    /**
     * 获取用户设备信息
     *
     * @param id
     * @return
     */
    String getUserDevice(long id);

    boolean syncMongoData(Long startId, Long endId);

    /**
     * 获取探探功能里的小头像
     *
     * @param point
     * @param sexType
     * @return
     */
    List<Long> findTantanPartAroundPeopleImg(Double[] point, Integer sexType);

    /**
     * 已存在用户头像压缩
     *
     * @param startId
     * @param endId
     * @return
     */
    boolean ExistUserImgCompression(Long startId, Long endId);

    /**
     * 获取用户小头像
     *
     * @param userId
     * @return
     */
    String getUserSmallAvatar(Long userId);

    /**
     * 处理用户小头像
     *
     * @param id
     */
    void CompressionAvatar(Long id);

    List<String> findPartAroundPeopleImgV3(Double[] point, Integer sexType, int v1RandomShowLimit);

    List<String> findTantanPartAroundPeopleImgV3(Double[] point, Integer sexType);

    boolean syncMysqlToMongo(Long startId, Long endId);

    public JSONObject loginById(LoginByIdDto loginDto);

    public List<JSONObject> getUserByNicknameOrPhone(String param);

    /**
     * @param
     * @return String
     * @throws
     * @Title: getInviteCode
     * @Description: 获取推广码，返回6位随机字符串
     */
    public String getInviteCode();

    /**
     * @param code
     * @return boolean
     * @throws
     * @Title: useInviteCode
     * @Description: 使用邀请码
     */
    public boolean useInviteCode(String code);

    public JSONObject inviteCodeView();

    UserInfo getUserById(Long id);

    ResponseEntity<Response> updateLoginPath(Double[] point);

    void checkInvite();
}
